
#include <stm32f10x.h> 

#include "delay.h"

uint8_t MatrixKey_GetNum(void);

void MatrixKey_Init()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

uint8_t MatrixKey_GetValue()
{
	uint8_t Key;
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
	GPIO_SetBits(GPIOA, GPIO_Pin_3);

	Key = MatrixKey_GetNum();
	if (Key != 0)
		return Key;

	GPIO_SetBits(GPIOA, GPIO_Pin_0);
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
	GPIO_SetBits(GPIOA, GPIO_Pin_3);

	Key = MatrixKey_GetNum();
	if (Key != 0)
		return Key + 4;

	GPIO_SetBits(GPIOA, GPIO_Pin_0);
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	GPIO_SetBits(GPIOA, GPIO_Pin_3);

	Key = MatrixKey_GetNum();
	if (Key != 0)
		return Key + 8;

	GPIO_SetBits(GPIOA, GPIO_Pin_0);
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
	GPIO_ResetBits(GPIOA, GPIO_Pin_3);

	Key = MatrixKey_GetNum();
	if (Key != 0)
		return Key + 12;
	return 0;
}

uint8_t MatrixKey_GetNum()
{
	uint8_t Key = 0;
	if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0)
	{
		delay_ms(10);
		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0)
			;
		Key = 1;
	}
	else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
	{
		delay_ms(10);
		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
			;
		delay_ms(10);
		Key = 2;
	}
	else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)
	{
		delay_ms(10);
		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)
			;
		delay_ms(10);
		Key = 3;
	}
	else if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0)
	{
		delay_ms(10);
		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0)
			;
		delay_ms(10);
		Key = 4;
	}
	return Key;
}

// 4	3	2	1
// 8	7	6	5
// 12	11	10	9
// 16	15	14	13
u32 Set_Time()
{
	u8 KeyNum = 0;
	u32 time = 0;
	u8 Num = 0;
	while (1)
	{
		KeyNum = MatrixKey_GetValue();
		if (KeyNum != 0)
		{
			if (KeyNum == 13)
			{
				break;
			}
			if (KeyNum == 0 || KeyNum == 1 || KeyNum == 5 || KeyNum == 9 || KeyNum == 14 || KeyNum == 16)
			{
				continue;
			}
			switch (KeyNum)
			{
			case 4:
				Num = 1;
				break;
			case 3:
				Num = 2;
				break;
			case 2:
				Num = 3;
				break;
			case 8:
				Num = 4;
				break;
			case 7:
				Num = 5;
				break;
			case 6:
				Num = 6;
				break;
			case 12:
				Num = 7;
				break;
			case 11:
				Num = 8;
				break;
			case 10:
				Num = 9;
				break;
			case 15:
				Num = 0;
				break;
			}
			time = (time * 10) + Num;
		}
	}
	return time;
}
